package myArrayList;

import java.util.Arrays;

public class MyArrayList {
    public int[] elem;
    public int usedSize;//当前有效的数据个数

    public MyArrayList(){
        this.elem = new int[10];//usedSize不初始化也为0,但elem不初始化就为null.
    }


   // 打印顺序表
   public void display() {
        for (int i = 0; i < this.usedSize;i++){
            System.out.print(this.elem[i]+" ");
        }
       System.out.println();
   }

   // 获取顺序表的有效数据长度
    public int size() { return this.usedSize; }

   // 在 pos 位置新增元素
    public void add(int pos, int data) {
        if (pos < 0 ||pos > this.usedSize){
            System.out.println("插入的位置有误!");
            return;
        }else{
            if (isFull()){
                this.elem = Arrays.copyOf(this.elem,this.elem.length*2);
            }
                for (int i = this.usedSize-1;i >= pos;i--){
                    this.elem[i+1] = this.elem[i];
                }
                this.elem[pos] = data;
                this.usedSize++;
        }
    }

   //判断数组是否满了
   public boolean isFull(){
       return this.usedSize == this.elem.length;
   }

   // 判定是否包含某个元素
   public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++){
            if (this.elem[i] == toFind){
                return true;
            }
        }
        return false;
   }

   // 查找某个元素对应的位置,找不到返回-1
   public int search(int toFind) {
       for (int i = 0; i < this.usedSize; i++){
           if (this.elem[i] == toFind){
               return i;
           }
       }
       return -1;
   }

   // 获取 pos 位置的元素
   public int getPos(int pos) {
        if (pos < 0 || pos >= this.usedSize){
            System.out.println("pos位置不合法!");
            return -1;//业务上的处理 这里暂不考虑
        }
        if (isEmpty()){
            System.out.println("顺序表为空!");
            return -1;
        }
        return this.elem[pos];
   }

   //检测是否为空
    public boolean isEmpty(){
        return this.usedSize == 0;
    }

   // 给 pos 位置的元素设为 value
    public void setPos(int pos, int value) {
        if (pos < 0 ||pos >= this.usedSize){
            System.out.println("pos位置不合法!");
            return;
        }
        if (isEmpty()){
            System.out.println("顺序表为空!");
            return;
        }
        this.elem[pos] = value;
    }

   //删除第一次出现的关键字key
    public void remove(int toRemove) {
        if (isEmpty()){
            System.out.println("顺序表为空!");
            return;
        }
        if (contains(toRemove)){
            int j = search(toRemove);
            for (int i = j; i < this.usedSize-1; i++){
                this.elem[i] = this.elem[i+1];
            }
            this.usedSize--;
            //this.elem[usedSize] = null; 如果数组当中是引用数据类型,最后一个一定要置空!
        }else {
            System.out.println("没有查找到该元素!");
            return;
        }

    }

   // 清空顺序表
    public void clear() {
        this.usedSize = 0; //因为这里放的是简单类型,存放也只和usedSize有关,下次存放就会把原有的数据覆盖掉了
/*        for (int i = 0; i < this.usedSize; i++){
            this.elem[i] = null;
        }
        this.usedSize = 0;
*/
        //如果这个顺序表放的是引用类型,必须要逐条置null,这样才算真正意义上清空顺序表(这样这些对象才会被回收)
    }
}
